const COS = require('cos-nodejs-sdk-v5');
const os = require('os');
const crypto = require('crypto');

/**
 * 腾讯云对象存储服务
 * 提供项目数据的云端存储和同步功能
 */
class COSService {
  constructor() {
    // 腾讯云COS配置
    this.config = {
      SecretId: 'AKIDvx7ERG4nOpV9h5LRM709KNJ9xtsjnwCK',
      SecretKey: '4z8A3oU2QirpdLuNgopgNtYbaVH6rW1S',
      Bucket: 'baoqu-host-manager-1252921383',
      Region: 'ap-guangzhou'
    };

    // 初始化COS客户端
    this.cos = new COS({
      SecretId: this.config.SecretId,
      SecretKey: this.config.SecretKey
    });

    // 所有用户共享的云端文件路径
    this.cloudFilePath = 'shared/project.json';
    
    // 共享数据根路径
    this.sharedDataRoot = 'shared/';
  }

  /**
   * 生成用户唯一标识
   * 基于MAC地址和主机名生成，确保同一台设备生成相同的ID
   * @returns {string} 用户唯一标识
   */
  generateUserId() {
    try {
      // 获取网络接口信息
      const interfaces = os.networkInterfaces();
      let macAddress = '';
      
      // 遍历网络接口，获取第一个非内部的MAC地址
      for (const name of Object.keys(interfaces)) {
        for (const iface of interfaces[name]) {
          // 跳过内部和IPv6地址
          if (!iface.internal && iface.mac !== '00:00:00:00:00:00') {
            macAddress = iface.mac;
            break;
          }
        }
        if (macAddress) break;
      }
      
      // 获取主机名
      const hostname = os.hostname();
      
      // 组合信息并生成哈希
      const data = macAddress + hostname;
      const hash = crypto.createHash('md5').update(data).digest('hex');
      
      return hash;
    } catch (error) {
      console.error('生成用户ID失败:', error);
      return 'default-user-' + Math.random().toString(36).substring(2, 10);
    }
  }
  
  /**
   * 上传数据到腾讯云
   * @param {Object} data 要上传的数据对象
   * @param {string} [customPath] 可选的自定义路径
   * @returns {Promise<boolean>} 上传是否成功
   */
  async uploadData(data, customPath) {
    try {
      const jsonContent = JSON.stringify(data, null, 2);
      const filePath = customPath || this.cloudFilePath;
      
      const result = await this.cos.putObject({
        Bucket: this.config.Bucket,
        Region: this.config.Region,
        Key: filePath,
        Body: jsonContent,
        ContentType: 'application/json',
        Headers: {
          'x-cos-meta-updated-by': 'whistle-host-manager',
          'x-cos-meta-updated-at': new Date().toISOString()
        }
      });

      console.log('数据上传到腾讯云成功:', result.Location);
      return true;
    } catch (error) {
      console.error('上传数据到腾讯云失败:', error.message);
      return false;
    }
  }

  /**
   * 从腾讯云下载数据
   * @param {string} [customPath] 可选的自定义路径
   * @returns {Promise<Object|null>} 下载的数据对象，失败返回null
   */
  async downloadData(customPath) {
    try {
      const filePath = customPath || this.cloudFilePath;
      
      const result = await this.cos.getObject({
        Bucket: this.config.Bucket,
        Region: this.config.Region,
        Key: filePath
      });

      if (result.Body) {
        const jsonContent = result.Body.toString();
        const data = JSON.parse(jsonContent);
        console.log(`从腾讯云下载数据成功: ${filePath}`);
        return data;
      }
      
      return null;
    } catch (error) {
      if (error.code !== 'NoSuchKey') {
        console.error(`从腾讯云下载数据失败 (${customPath || this.cloudFilePath}):`, error.message);
      }
      return null;
    }
  }

  /**
   * 检查云端文件是否存在
   * @param {string} [customPath] 可选的自定义路径
   * @returns {Promise<boolean>} 文件是否存在
   */
  async fileExists(customPath) {
    try {
      const filePath = customPath || this.cloudFilePath;
      
      await this.cos.headObject({
        Bucket: this.config.Bucket,
        Region: this.config.Region,
        Key: filePath
      });
      return true;
    } catch (error) {
      return false;
    }
  }

  /**
   * 获取云端文件的最后修改时间
   * @param {string} [customPath] 可选的自定义路径
   * @returns {Promise<Date|null>} 最后修改时间，失败返回null
   */
  async getLastModified(customPath) {
    try {
      const filePath = customPath || this.cloudFilePath;
      
      const result = await this.cos.headObject({
        Bucket: this.config.Bucket,
        Region: this.config.Region,
        Key: filePath
      });
      
      return new Date(result.headers['last-modified']);
    } catch (error) {
      console.error(`获取云端文件修改时间失败 (${customPath || this.cloudFilePath}):`, error.message);
      return null;
    }
  }

  /**
   * 同步数据到云端（非阻塞）
   * @param {Object} data 要同步的数据
   * @param {string} [customPath] 可选的自定义路径
   */
  syncToCloud(data, customPath) {
    // 异步执行，不阻塞主流程
    setImmediate(async () => {
      const success = await this.uploadData(data, customPath);
      if (!success) {
        console.warn('云端同步失败，但不影响本地操作');
      }
    });
  }
  
  /**
   * 获取当前用户ID
   * @returns {string} 用户唯一标识
   */
  getUserId() {
    return this.generateUserId(); // 使用生成用户ID的函数
  }
  
  /**
   * 列出指定目录下的所有对象
   * @param {string} prefix 目录前缀
   * @returns {Promise<Array>} 对象列表
   */
  async listObjects(prefix) {
    try {
      const result = await this.cos.getBucket({
        Bucket: this.config.Bucket,
        Region: this.config.Region,
        Prefix: prefix
      });
      
      return result.Contents || [];
    } catch (error) {
      console.error(`列出对象失败 (${prefix}):`, error.message);
      return [];
    }
  }
}

// 创建单例实例
const cosService = new COSService();

module.exports = cosService;
